const fs = require('fs');

const timeoutScheduled = Date.now();

// 异步任务一：100ms 后执行的定时器
setTimeout(() => {
  const delay = Date.now() - timeoutScheduled;
  console.log(`${delay}ms`);
}, 100);

// 异步任务二：文件读取后，有一个 200ms 的回调函数
fs.readFile('test.js', () => {
  const startCallback = Date.now();
  while (Date.now() - startCallback < 1200) {
    // 什么也不做
  }
});

class MyEvent {
  constructor() {
      this.listeners = []; // 收集订阅者
  }
  addListener(name, fn) {
      // 监听器不存在时，先新建
      if (!this.listeners[name]) {
          this.listeners[name] = [];
      }
      this.listeners[name].push(fn);

  }
  // 移除事件，即从订阅者列表里删除对应订阅者
  removeListener(name, fn) {
      let fns = this.listeners[name];
      this.listeners[name] = fns.filter(f => f !== fn);
  }
  trigger() {// 变化发生时，一个地方触发，引起其他多个地方的集中接收-遍历触发订阅者列表里的方法，即为发布
      let name = Array.prototype.shift.call(arguments);
      this.listeners[name].forEach(fn => {
          fn.apply(this, arguments); // arguments指向trigger中的
      });
  }
}

let e = new MyEvent();
e.addListener('call', f11 = function(name) { // 绑定事件即为订阅
  console.log('call:', name)
});

e.trigger('call', 'kiwi');